package in.rob.client.page;
import in.lib.Constants;
import in.lib.adapter.AccountAdapter;
import in.lib.adapter.PrivateMessageAdapter;
import in.lib.event.DeletePrivateMessageEvent;
import in.lib.event.NewPrivateMessageEvent;
import in.lib.handler.streams.MessagesResponseHandler;
import in.lib.helper.ResponseHelper;
import in.lib.manager.APIManager;
import in.model.Channel;
import in.model.PrivateMessage;
import in.model.User;
import in.rob.client.ProfileActivity;
import in.rob.client.R;
import in.rob.client.dialog.base.DialogBuilder;
import in.rob.client.page.base.MessageStreamFragment;
import java.util.ArrayList;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import com.squareup.otto.Subscribe;
/**
* Fragment used for displaying posts in a fragment list
* @author callumtaylor
*/
public class MessagesPage extends MessageStreamFragment
{
private Channel channel;
private PrivateMessage centerMessage;
@Override public void retrieveArguments(Bundle arguments)
{
super.retrieveArguments(arguments);
if (arguments != null)
{
if (arguments.containsKey(Constants.EXTRA_CHANNEL))
{
channel = (Channel)arguments.getParcelable(Constants.EXTRA_CHANNEL);
}
else if (arguments.containsKey(Constants.EXTRA_CHANNEL_ID))
{
channel = new Channel();
channel.setId(arguments.getString(Constants.EXTRA_CHANNEL_ID));
}
if (arguments.containsKey(Constants.EXTRA_CENTER_MESSAGE))
{
centerMessage = (PrivateMessage)arguments.getParcelable(Constants.EXTRA_CENTER_MESSAGE);
}
}
}
@Override public boolean onOptionsItemSelected(MenuItem item)
{
if (item.getItemId() == R.id.menu_subscribed)
{
final ArrayList<User> loadedUsers = new ArrayList<User>();
for (String s : channel.getReaders())
{
User u = User.loadUser(s);
if (u != null)
{
loadedUsers.add(u);
}
}
DialogBuilder.create(getContext())
.setTitle(R.string.subscribers)
.setAdapter(new AccountAdapter(getContext(), R.layout.user_dialog_list_item, loadedUsers), new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
Intent profileIntent = new Intent(getContext(), ProfileActivity.class);
profileIntent.putExtra(Constants.EXTRA_USER, loadedUsers.get(which));
startActivity(profileIntent);
dialog.dismiss();
}
})
.setNegativeButton(R.string.close, null)
.show();
}
return super.onOptionsItemSelected(item);
}
@Override public void onDataReady()
{
if (centerMessage == null)
{
centerMessage = (PrivateMessage)getAdapter().getItem(0);
}
((PrivateMessageAdapter)getAdapter()).setCenter(centerMessage);
checkAdapterSizes();
}
@Override public void fetchStream(String lastId, boolean append)
{
showProgressLoader();
MessagesResponseHandler handler = new MessagesResponseHandler(getApplicationContext(), append);
handler.setResponseKey(getResponseKeys()[0]);
ResponseHelper.getInstance().addResponse(getResponseKeys()[0], handler, this);
APIManager.getInstance().getMessages(channel.getId(), lastId, handler);
}
@Override public void onDestroyView()
{
if (getAdapter().getStreamMarker() != null)
{
APIManager.getInstance().updateMarker(getAdapter().getFirstId(), getAdapter().getStreamMarker().getName(), null);
}
super.onDestroyView();
}
@Override public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3)
{
centerMessage = (PrivateMessage)getAdapter().getItem(position - getListView().getHeaderViewsCount());
((PrivateMessageAdapter)getAdapter()).setCenter(centerMessage);
getAdapter().notifyDataSetChanged();
}
@Override public String getCacheFileName()
{
return String.format(Constants.CACHE_MESSAGE_LIST_NAME, channel.getId());
}
@Override public String[] getResponseKeys()
{
return new String[]{String.format(Constants.RESPONSE_MESSAGES, channel.getId())};
}
@Subscribe @Override public void onMessageRecieved(NewPrivateMessageEvent p)
{
if (p != null && p.getMessage().getChannelId().equals(channel.getId()))
{
super.onMessageRecieved(p);
}
}
@Subscribe @Override public void onMessageDeleted(DeletePrivateMessageEvent p)
{
super.onMessageDeleted(p);
}
}